#include<bits/stdc++.h>
using namespace std;
struct car{
	int d,v,a;
	bool is_s;
};
const int MAXN=114514;
car com[MAXN];
int det[MAXN];
set<int> by[MAXN];
vector<int> fines[MAXN];
int main(){
	freopen("detect.in","r",stdin);
	freopen("detect.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.sync_with_stdio(0);
	cout.sync_with_stdio(0);
	int T;
	cin>>T;
	while(T--){
		int ans1=0,ans2=0;
		for(int i=0;i<100005;i++){
			com[i].is_s=false;
		}
		int n,m,l,v;
		cin>>n>>m>>l>>v;
		for(int i=1;i<=n;i++){
			cin>>com[i].d>>com[i].v>>com[i].a;
		}
		//cout<<"read ok!"<<endl;
		for(int i=1;i<=m;i++){
			cin>>det[i];
			for(int j=1;j<=n;j++){
				if(det[i]>=com[j].d&&pow(com[j].v,2)+2*com[j].a*(det[i]-com[j].d)>v*v){
					if(!com[j].is_s){
					com[j].is_s=true;
					ans1++;
					//cout<<"car#"<<j<<"overspeed at"<<i<<endl;
					}
					by[j].insert(i);
					fines[i].push_back(j);
				}
				
			}

		}
		//cout<<"for1 ok!"<<endl;
		for(int i=1;i<=m;i++){
			bool flag=1;
			for(auto j:fines[i]){
				if(by[j].size()<=1){
					flag=0;
					break;
				}
			}
			if(flag){
				for(auto j:fines[i]){
					by[j].erase(i);
			}
			}
			ans2+=flag;
		}
		cout<<ans1<<' '<<ans2<<endl;
	}
	return 0;
}
	
